/*
 * 
 * 
 */
package JavaDictController;

import JavaDictDBModel.DBModelV2;
import java.util.ArrayList;

/**
 * Kelas kontroler dari JavaDict
 * Berfungsi untuk menghubungkan model dengan View
 * @author Sambya
 */
public class JDController {

    private static String[] lang = 
        {"Indonesia"
         ,"English"
         //,"Deutch"
        };
    private static String[] available_data_structure = 
        {"Tree Map"
         ,"Hash Map"
        };
    
    private int langfr;
    private int langto;
    private int curtype;
    private DBModelV2 DictData;
   
    /**
     * Konstruktor dari kelas JDController
     */
    public JDController() {
        langfr = 0;
        langto = 1;
        curtype = 0;
        DictData = new DBModelV2(langfr, langto,curtype);
    }
    
    /**
     * Konstruktor dari kelas JDController
     */
    public JDController(int _langfr, int _langto, int tipe) {
        assert (_langfr != _langto):"ERROR: langfr = langto";
        assert (_langfr >= 0 && _langfr < lang.length):"ERROR: langfr out of range";
        assert (_langto >= 0 && _langto < lang.length):"ERROR: langto out of range";
        langfr = _langfr;
        langto = _langto;
        curtype = tipe;
        DictData = new DBModelV2(langfr, langto, curtype);
    }
    
    /**
     * Mengubah bahasa yang akan ditranslasi
     * I.S. bahasa tersedia di konstanta lang[]
     * I.S. langto != langfr
     * @param _langfr nomor bahasa asal
     * @param _langto nomor bahasa tujuan
     * @return status keberhasilan
     */
    public int ChangeLang(int _langfr, int _langto) {
        assert (_langfr != _langto):"ERROR: langfr = langto";
        assert (_langfr >= 0 && _langfr < lang.length):"ERROR: langfr out of range";
        assert (_langto >= 0 && _langto < lang.length):"ERROR: langto out of range";
        langto = _langto;
        langfr = _langfr;
        // update DB sekarang
        DictData = new DBModelV2(_langfr, _langto, curtype);
        //System.gc();
        return 1;
    }
    
    /**
     * Mencari suatu string dalam database
     * I.S. : _value tidak kosong
     * @param _value Suatu kata
     * @return Vector of String berisikan arti dari kata tersebut
     */
    public ArrayList<String> Search(String _value) {
        assert (_value.length()>0):"ERROR: _value Empty";
        ArrayList<String> value = DictData.DBSearch(_value);       
        return value;
    }
    
    /**
     * Mendeteksi bahasa dari suatu kata
     * I.S. : SearchVal tidak kosong
     * @param _value Suatu kata
     * @return bahasa dari kata tersebut. String kosong jika bukan merupakan bahasa apapun
     */
    public String DetectLang(String _value) {
        assert (_value.length()>0):"ERROR: _value Empty";
        boolean temp=false;
        int val = -1;
        int len = lang.length;
        
        for (int i=0; i<len-1; ++i){
            for (int j=i+1;j<len; ++j){
                
                //buka library i -> j
                DictData = new DBModelV2(i, j, curtype);
                //System.gc();
                temp = DictData.isValueinDB(_value);
                if (temp) {
                    val = i;
                    break;
                }

                //buka library j -> i
                DictData = new DBModelV2(j, i, curtype);
                //System.gc();
                temp = DictData.isValueinDB(_value);
                if (temp) {
                    val = j;
                    break;
                }
            }
            if (val!=-1) break;
        }
        
        
        //reset ke database awal
        DictData = new DBModelV2(langfr, langto, curtype);
        //System.gc();
        if (val>=0){
            return lang[val];
        } else {
            return "";
        }
            
    }
    
    /**
     * Menambahkan data ke dalam kamus
     * I.S.: _valfr,_type1, _valto,_type1 tidak kosong
     * F.S.: terdapat entri baru didalam file
     * @param _valfr kata asal
     * @param _type1 tipe kata asal
     * @param _valto kata tujuan
     * @param _type1 tipe kata tujuan
     */
    
    public void AddEntry(String _valfr, String _type1, String _valto, String _type2) {
        assert(_valfr.length()>0):"ERROR: _valfr empty";
        assert(_type1.length()>0):"ERROR: _type1 empty";
        assert(_valto.length()>0):"ERROR: _valto empty";
        assert(_type2.length()>0):"ERROR: _type2 empty";
        _valfr=_valfr.toLowerCase();
        _type1=_type1.toLowerCase();
        _valto=_valto.toLowerCase();
        _type2=_type2.toLowerCase();
        //if (langto<langfr) {
        //    DictData.DBInsert(_valto, _type2, _valfr, _type1);
        //} else {
        DictData.DBInsert(_valfr, _type1, _valto, _type2);
        //}
        //DictData=new DBModelV2(langfr, langto);
        ////System.gc();
    }
    
    /**
     * 
     * @return semua data dalam database
     */
    public String ViewAll(){
        return DictData.GetAll().toString();
    }
    
    /**
     * 
     * @return tipe struktur data yang sedang dipakai 
     */
    public String ViewInternal(){
        return available_data_structure[curtype];
    }
    
    /**
     * Mengembalikan tipedata yang tersedia
     * @return Bahasa yang tersedia
     */
    public static String[] getAvailableDataStruct(){
        return available_data_structure;
    }
    
    
    /**
     * Mengembalikan bahasa yang tersedia
     * @return Bahasa yang tersedia
     */
    public String[] getLangs(){
        return lang;
    }
    
    /**
     * Mengembalikan kode bahasa asal
     * @return Bahasa asal
     */
    public int getLangFr(){
        return langfr;
    }
    
    /**
     * Mengembalikan kode bahasa tujuan
     * @return Bahasa tujuan
     */
    public int getLangTo(){
        return langto;
    }
    
}
